﻿#include "windows.h"
#include "tchar.h"

#pragma warning (disable : 4996)
#pragma comment (lib, "user32")
#pragma comment (lib, "gdi32")

HWND 		hWnd;
WNDPROC 	Proc;

VOID PrintInfo(LPTSTR Format, ...){
	va_list Args;
	TCHAR   String[8192];

	va_start(Args, Format);
	_vstprintf(String, Format, Args);
	va_end(Args);

	OutputDebugString(String);
}

VOID CALLBACK KeyTimerProc(HWND, UINT, UINT id, DWORD) {							// 从WM_TIMER消息而来 50ms一次
	if (0x8000 & GetKeyState('Q')){													// 按Q键，认为是QUIT。其它无窗口函数可以参考此方式。
		PostQuitMessage(0);															// 把WM_QUIT放入消息队列，令GetMessage返回FALSE,以退出消息循环
		PrintInfo(_T("Leave"));
	}

	SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);			// 保证窗口在最上层
}

LRESULT CALLBACK WindowProc(HWND h, UINT msg, WPARAM w, LPARAM l) {
	switch(msg){
	case WM_ERASEBKGND:																// 不删除窗口
		return 1;
	case WM_PAINT:																	// 不绘制窗口
		PAINTSTRUCT Paint;
		BeginPaint(hWnd, &Paint);
		EndPaint(hWnd, &Paint);
		return 0;
	}

	return CallWindowProc(Proc, h, msg, w, l);
} 

BOOL CreateFreezeWindow() {
	hWnd = CreateWindowEx(WS_EX_TOOLWINDOW, 										// 隐藏任务栏图标
		_T("STATIC"), _T(""), WS_POPUP, 											// 不用注册窗口类
		0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN), 		// 全屏
		GetDesktopWindow(), NULL, GetModuleHandle(NULL), NULL);						// 以Root为父窗口
	if (!hWnd) return FALSE;
	Proc = (WNDPROC) SetWindowLong(hWnd, GWL_WNDPROC, (LONG) WindowProc);			// 实现透明
	ShowWindow(hWnd, SW_SHOW);														// 显示窗口
	return TRUE;
}

int CALLBACK _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow){
	if (!CreateFreezeWindow()) return 0;											// 创建全屏透明窗口

	UINT id = SetTimer(NULL, NULL, 50,  KeyTimerProc);								// 1. 实现退出机制，按Q键退出。 2. 把窗口Z-Oder拉到最上层

	MSG msg;
	while (GetMessage(&msg, NULL, NULL, NULL)){
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	DestroyWindow(hWnd);															// 销毁窗口
	KillTimer(NULL, id);															// 关闭定时器

	return msg.wParam;
}


